﻿@page "/"

<Text>StartDate</Text>
<DatePicker TValue="DateTime?" ShowTime="@true"
            Format="yyyy-MM-dd HH:mm:ss"
            OnChange="e=>InTime = e.Date" />

<Text>EndDate</Text>
<DatePicker TValue="DateTime?" ShowTime="@true"
            Format="yyyy-MM-dd HH:mm:ss"
            OnChange="e=>OutTime = e.Date" />

<Button OnClick="Calculator">计算</Button>
<Text>@payMinutes</Text>

@code {
    private int payMinutes { get; set; }

    private string PayStart { get; set; } = "22:00"; // 闭馆时间
    private string PayEnd { get; set; } = "07:00"; // 开馆时间

    private DateTime InTime { get; set; } = new DateTime(2020, 05, 11, 0, 0, 0); // 存入时间
    private DateTime OutTime { get; set; } = new DateTime(2020, 05, 11, 0, 0, 0); // 取出时间

    private void Calculator()
    {
      var PayStartTime = DateTime.Parse(PayStart); // 闭馆时间转换
      var PayEndTime = DateTime.Parse(PayEnd).AddDays(1); // 开馆时间转换
      var StartTime = (InTime.Hour > PayEndTime.Hour)
        ? InTime.Date.AddHours(PayEndTime.Hour).AddMinutes(PayEndTime.Minute)
        : InTime.Date.AddDays(-1).AddHours(PayEndTime.Hour).AddMinutes(PayEndTime.Minute); // 确定开始计算时间点
      
      var pCycle = 24 * 60; // 单位周期时间长度(24小时)
      var pCycleFree = (PayStartTime.Hour - PayEndTime.Hour) * 60 + PayStartTime.Minute - PayEndTime.Minute; // 单位周期内免费时间长度
      var cycleCount = (int)OutTime.Subtract(StartTime).TotalMinutes / (pCycle); // 完整周期数量
      var incompleteCycle = (int)OutTime.Subtract(StartTime).TotalMinutes - pCycle * cycleCount; // 不足一周期时间长度
      var pCyclePay = (int)PayEndTime.Subtract(PayStartTime).TotalMinutes; // 单位周期收费时间长度
      // 付费总时长计算: 完整周期内收费时间长度＋不足周期收费时间长度
      payMinutes = cycleCount * pCyclePay - ((int)InTime.Subtract(StartTime).TotalMinutes / pCycleFree) * ((int)InTime.Subtract(StartTime).TotalMinutes - pCycleFree)
        + (incompleteCycle / pCycleFree) * (incompleteCycle - pCycleFree);
    }
}